# ------------------------------------ # gestion_eau.py # Programme de contrôle des réservoirs # ------------------------------------ from donnees import reservoirs # Question 1 : écrire la fonction est_en_penurie def est_en_penurie(reservoirs, nom_reservoir): for r in reservoirs: if r["nom"] == nom_reservoir: return r["volume"] * 100 / r["capacite"] < 20 # Question 2 : écrire la fonction volume_par_district def volume_par_district(reservoirs): dico = {} for r in reservoirs: district = r["district"] volume = r["volume"] if district not in dico: dico[district] = 0 dico[district] += volume # Question 3 def volume_moyen(reservoirs): """ Renvoie le volume moyen d'eau disponible dans les réservoirs. """ somme_totale = 0 for r in reservoirs: somme_totale += r["volume"] moyenne = somme_totale / (len(reservoirs)) # moyenne = somme_totale / (len(reservoirs)-1) return moyenne def test_volume_moyen(): assert len(reservoirs) > 0 resultat = volume_moyen(reservoirs) plus_grande_capacite = 0 for r in reservoirs: if r["capacite"] > plus_grande_capacite: plus_grande_capacite = r["capacite"] assert resultat <= plus_grande_capacite test1 = [ {"nom": "R1", "capacite": 100, "volume": 50, "district": "A"}, {"nom": "R2", "capacite": 200, "volume": 50, "district": "B"} ] assert volume_moyen(test1) == 50 test2 = [ {"nom": "R1", "capacite": 100, "volume": 20, "district": "A"} ] assert volume_moyen(test2) == 20 test_volume_moyen() # Question 4 def taux_remplissage(reservoir, changement=0): """ Renvoie le taux de remplissage du réservoir (en pourcentage), en tenant compte d'un changement éventuel du volume. Attention : le changement n'est pas effectif, il est hypothétique. - changement > 0 : ajout d'eau - changement < 0 : retrait d'eau - changement = 0 (par défaut) : taux de remplissage réel """ volume_modifie = reservoir["volume"] + changement capacite = reservoir["capacite"] # On évite de dépasser les limites physiques if volume_modifie < 0: volume_modifie = 0 if volume_modifie > capacite: volume_modifie = capacite return volume_modifie * 100 / capacite def liste_districts(reservoirs): """ Renvoie la liste des districts présents dans les données. """ liste = [] for r in reservoirs: if (r["district"] not in liste): liste.append(r["district"]) return liste def reservoirs_par_district(reservoirs): """ Renvoie un dictionnaire associant chaque district à la liste des réservoirs qui s’y trouvent. """ liste_rpd = {} for r in reservoirs: district = r["district"] if district not in liste_rpd: liste_rpd[district] = [] liste_rpd[district].append(r) return liste_rpd def districts_vulnerables(reservoirs, seuil=0.8): moyenne_globale = volume_moyen(reservoirs) regroupement = reservoirs_par_district(reservoirs) vulnerables = [] for district in regroupement: moyenne_district = volume_moyen(regroupement[district]) if moyenne_district < seuil * moyenne_globale: vulnerables.append(district) return vulnerables print(districts_vulnerables(reservoirs, 0.8)) # Stratégie de gestion possible # Sans l’implémenter, on peut proposer : # transférer de l’eau depuis des districts mieux dotés vers Tepua ; # prioriser les réservoirs de Tepua dans les redistributions ; # mettre en place des restrictions temporaires d’usage dans ce district ; # renforcer la surveillance des réservoirs les plus bas ; # prévoir l’approvisionnement par camion-citerne si nécessaire.